﻿using ShoppingCart.Models;
using StackExchange.Redis;

namespace ShoppingCart.Tools
{
    /// <summary>
    /// Redis 服务类
    /// </summary>
    public class RedisService
    {
        private readonly ConnectionMultiplexer _redis;
        private readonly IDatabase _database;

        public RedisService(IConfiguration configuration)
        {
            var connectionString = configuration.GetValue<string>("RedisConnection");// 获取 Redis 连接字符串
            _redis = ConnectionMultiplexer.Connect(connectionString);
            _database = _redis.GetDatabase();// 获取 Redis 数据库实例，默认为 0
        }

        /// <summary>
        /// 获取购物车（通过 CartId）
        /// </summary>
        /// <param name="cartId"></param>
        /// <returns></returns>
        public async Task<Cart> GetCartAsync(string cartId)
        {
            var cartJson = await _database.StringGetAsync(cartId);
            if (string.IsNullOrEmpty(cartJson))
            {
                return new Cart(); // 如果购物车为空，返回空的购物车
            }
            return Cart.FromJson(cartJson); // 反序列化为购物车对象
        }

        /// <summary>
        /// 设置购物车数据（保存为 JSON 格式）
        /// </summary>
        /// <param name="cartId"></param>
        /// <param name="cart"></param>
        /// <returns></returns>
        public async Task SetCartAsync(string cartId, Cart cart)
        {
            var cartJson = cart.ToJson();
            await _database.StringSetAsync(cartId, cartJson);
        }

        /// <summary>
        /// 删除购物车数据
        /// </summary>
        /// <param name="cartId"></param>
        /// <returns></returns>
        public async Task DeleteCartAsync(string cartId)
        {
            await _database.KeyDeleteAsync(cartId);
        }

        /// <summary>
        /// 获取下一个签到编号
        /// </summary>
        /// <returns></returns>
        public async Task<int> GetNextSignInNumber()
        {
            var nextSignInNumber = await _database.StringIncrementAsync("signInNumber");
            return (int)nextSignInNumber;
        }


        /// <summary>
        /// 判断用户今天是否可以签到
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task<bool> CanUserSignInToday(int userId)
        {
            // 获取今天的日期（yyyyMMdd 格式）
            string today = DateTime.Now.ToString("yyyyMMdd");

            // 构建用户的签到键
            string signInKey = $"signIn:{userId}:{today}";

            // 尝试设置键，若键已存在则返回 false（用户已签到）
            bool isFirstSignIn = await _database.StringSetAsync(signInKey, "1", TimeSpan.FromDays(1), When.NotExists);

            // 如果键已存在，表示当天已经签到过，返回 false
            return isFirstSignIn;  // 返回 true 表示可以签到，false 表示已签到
        }


    }

}
